package cn.gok.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @Author: chenfan
 * @Date: 2020/12/6 16:18
 * @Description: 静态资源处理类
 */

public class StaticResourceUtil {

    /**
     * 当前方法主要使用用来解析请求地址，获取静态资源的绝对路径
     */
//    public static String getAbsolutePath(String path){
//        String absolutePath = StaticResourceUtil.class.getResource("/").getPath();
//        return absolutePath.replaceAll("\\\\","/") + path;
//    }


    /**
     *  读取静态资源，通过输出流输出到客户端
     * @param inputStream
     * @param outputStream
     */
    public static void outputStaticReource(InputStream inputStream, OutputStream outputStream) throws IOException {

        /*
          获取请求的字节长度
              因为我们进行的是网络请求，有时候可能会读不到数据，
               所以此处的while循环是当读到有数据时再继续向下执行
         */
        int length = 0;
        while (length == 0){
            length = inputStream.available();
        }

        int resourceSize = length;

        //先输出http请求头，再输出具体内容
        outputStream.write(HttpProtocolUtil.getHttpHeader200(resourceSize).getBytes());

        //读取内容输出
        long written = 0; // 已经读取到的内容的字节长度
        int byteSize = 1024; // 计划每次缓冲的的字节长度
        byte[] bytes = new byte[byteSize];

        // 当已经读到的数据 > 总的数据时， 则结束循环
        while (written < resourceSize){

            // 此时说明剩余未读取大小不足  1024
            if (written + byteSize > resourceSize){
                //获取剩余内容真实长度
                byteSize =(int) (resourceSize - written);
                bytes = new byte[byteSize];
            }

            inputStream.read(bytes);
            outputStream.write(bytes);
            outputStream.flush();

            //每次循环，已经读到的字节数都会增加
            written += byteSize;
        }

    }

}
